home *** CD-ROM | disk | FTP | other *** search
/ BCI NET 2 / BCI NET 2.iso / archives / programming / source / btoc_v12.lha / BtoCDir / ExplodeStuff / GCC / decrunch30.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-04-27  |  1.2 KB  |  79 lines

  1. /* C-function containing inline assembler routine */
  2. /* for decrunching data compressed with BtoC v2.5 */
  3. /* or upper                                       */
  4. /* Copyright © 1992-1994 by Stefano Reksten       */
  5.  
  6. /* To be used with GCC, linked with other sources */
  7.  
  8. #include <exec/types.h>
  9.  
  10. __inline BOOL
  11. Decrunch30(UBYTE *dest,UBYTE *source)
  12. {
  13.     register BOOL d0 __asm("d0");
  14.     register UBYTE *a0 __asm("a0") = dest;
  15.     register UBYTE *a1 __asm("a1") = source;
  16.     __asm ("
  17.     moveml    d1-d5/a0-a1,sp@-;
  18.     movel    a1@+,d0;
  19.     cmpl    #1112821571,d0;
  20.     beq    ok_go;
  21.     moveq    #0,d0;
  22.     bra    end;
  23. ok_go:
  24.     movel    a1@+,d0;
  25.     moveb    a1@+,d1;
  26.     moveq    #0,d4;
  27.     moveb    a1@+,d4;
  28. loop:
  29.     cmpb    a1@,d1;
  30.     beq    explode;
  31.     moveb    a1@+,a0@+;
  32.     subl    #1,d0;
  33.     beq    end;
  34.     bra    loop;
  35. explode:
  36.     addl    #1,a1;
  37.     moveq    #0,d2;
  38.     moveb    a1@+,d2;
  39.     cmpb    d2,d4;
  40.     bhi    else;
  41.     subl    d4,d2;
  42.     beq    skip_byt;
  43.     moveb    a1@+,d3;
  44.     bra    expl;
  45. skip_byt:
  46.     moveb    a1@+,d5;
  47.     moveq    #7,d2;
  48.     moveb    d1,a0@+;
  49. skip_loop:
  50.     btst    d2,d5;
  51.     bne    put_byte;
  52.     moveb    d1,a0@+;
  53.     bra    ok;
  54. put_byte:
  55.     moveb    a1@+,a0@+;
  56. ok:
  57.     dbra    d2,skip_loop;
  58.     subl    #9,d0;
  59.     bra    done;
  60. else:
  61.     moveb    d1,d3;
  62. expl:
  63.     subl    d2,d0;
  64.     subb    #1,d2;
  65. exploop:
  66.     moveb    d3,a0@+;
  67.     dbra    d2,exploop;
  68. done:
  69.     tstl    d0;
  70.     beq    all_done;
  71.     bra    loop;
  72. all_done:
  73.     moveq    #1,d0;
  74. end:
  75.     moveml    sp@+,d1-d5/a0-a1;
  76.     ");
  77.     return d0;
  78. }
  79.